package Thread;/*
 *
 *@author:    Xavier
 *@data:      2024 - 01 - 13
 *@time:      09:04
 *
 */


import java.util.Scanner;

// 加锁和内存可见性 都是描述线程安全问题的典型情况和处理方式


// 内存可见性
public class Demo13 {
    private volatile static int isQuit = 0;
    // volatile 本质上是保证变量的内存可见性 - 禁止该变量的读操作被优化读到寄存器中
    // 保证了内存的可见性 但不保证原子性

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            while (isQuit == 0) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                //这里面加了个sleep 影响了while循环 编译器不打算 优化了
                // 即使不加volatile也不会触发编译器优化
            }
            System.out.println("t1 over!");
        });

        Thread t2 = new Thread(() -> {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入isQuit的值：");
            isQuit = scanner.nextInt();

        });

        t1.start();
        t2.start();
    }
}
